package com.sky.service.impl;

import com.sky.context.BaseContext;
import com.sky.dto.ShoppingCartDTO;
import com.sky.entity.Dish;
import com.sky.entity.Setmeal;
import com.sky.entity.ShoppingCart;
import com.sky.mapper.DishMapper;
import com.sky.mapper.SetmealMapper;
import com.sky.mapper.ShoppingCartMapper;
import com.sky.result.Result;
import com.sky.service.ShoppingCartService;
import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.web.bind.annotation.RequestBody;

import java.time.LocalDateTime;
import java.util.List;

@Service
public class ShoppingCartServiceImpl implements ShoppingCartService {

	@Autowired
	private ShoppingCartMapper shoppingCartMapper;
	@Autowired
	private DishMapper dishMapper;
	@Autowired
	private SetmealMapper setmealMapper;

	/**
	 * 添加购物车
	 *
	 * @param shoppingCartDTO
	 */
	public void addShoppingCart(ShoppingCartDTO shoppingCartDTO) {
		//首先需要判断添加购物车时候该商品是否已经存在在购物车中
		//如果已经存在，就更新数量，数量加1；然后更新购物车
		//如果不存在，就需要判断是添加到购物车的是菜品还是套餐，然后插入数据，数量就是1

		//创建购物车对象，将dto对象中的数据复制到购物车对象中
		ShoppingCart shoppingCart = new ShoppingCart();
		BeanUtils.copyProperties(shoppingCartDTO, shoppingCart);
		//这里使用ThredLocal来获取当前登录的用户id，将当前购物车绑定到当前登录的用户下
		//这样做的好处是，可以实现不同用户之间的购物车隔离
		shoppingCart.setUserId(BaseContext.getCurrentId());

		//判断当前商品是否在购物车中，如果存在，就查询出原对象的列表，封装为shoppingCartList
		//如果为空的话，即为null，说明不存在，则需要插入数据
		//根据我们设定的条件，这里只会查到一条数据，所以可以直接取第一条数据
		List<ShoppingCart> shoppingCartList = shoppingCartMapper.list(shoppingCart);

		//判断当前添加到购物车的是菜品还是套餐
		if (shoppingCartList != null && shoppingCartList.size() == 1) {
			//如果数据已经存在，就更新数量，数量加1
			shoppingCart = shoppingCartList.get(0);//获取到原先的购物车对象
			shoppingCart.setNumber(shoppingCart.getNumber() + 1);//在原先的基础上加1
			shoppingCartMapper.updateNumberById(shoppingCart);//调用更新方法，更新购物车的数量
		} else {
			//如果不存在，就需要插入数据，数量就是1
			//判断当前添加到购物车的是菜品还是套餐，购物车要新增的话，只有这两种
			//如果是菜品，就从菜品表中获取菜品信息，如果是套餐，就从套餐表中获取套餐信息
			Long dishId = shoppingCartDTO.getDishId();//获取到菜品id
			if (dishId != null) {
				//菜品id不为空，说明是添加到购物车的是菜品
				Dish dish = dishMapper.getById(dishId);//根据菜品id从菜品表中获取菜品信息
				shoppingCart.setName(dish.getName());//设置购物车的名称
				shoppingCart.setImage(dish.getImage());//设置购物车的图片
				shoppingCart.setAmount(dish.getPrice());//设置购物车的价格
			} else {
				//程序运行到这里，说明是添加到购物车的是套餐
				//根据前端传来的套餐id，从套餐表中获取套餐信息setmeal
				Setmeal setmeal = setmealMapper.getById(shoppingCartDTO.getSetmealId());
				shoppingCart.setName(setmeal.getName());//设置购物车的名称
				shoppingCart.setImage(setmeal.getImage());//设置购物车的图片
				shoppingCart.setAmount(setmeal.getPrice());//设置购物车的价格
			}
			//无论是菜品还是套餐，都需要设置数量和创建时间，所以提取出来，减少代码重复
			shoppingCart.setNumber(1);//因为是新增，所以数量就是1，前端只允许一个一个添加
			shoppingCart.setCreateTime(LocalDateTime.now());
			//无论是菜品还是套餐，都统一将数据插入到购物车表中
			shoppingCartMapper.insert(shoppingCart);
		}
	}

	/**
	 * 查看购物车
	 * @return
	 */
	public List<ShoppingCart> showShoppingCart() {
		return shoppingCartMapper.list(ShoppingCart.
				builder().
				userId(BaseContext.getCurrentId()).//.设置当前登录的用户id
				build());
	}

	/**
	 * 清空购物车商品
	 */
	public void cleanShoppingCart() {
		shoppingCartMapper.deleteByUserId(BaseContext.getCurrentId());
	}

	/**
	 * 删除购物车中一个商品
	 * @param shoppingCartDTO
	 */
	public void subShoppingCart(ShoppingCartDTO shoppingCartDTO) {
		//创建购物车对象，将dto对象中的数据复制到购物车对象中
		ShoppingCart shoppingCart = new ShoppingCart();
		BeanUtils.copyProperties(shoppingCartDTO,shoppingCart);
		//设置查询条件，查询当前登录用户的购物车数据
		shoppingCart.setUserId(BaseContext.getCurrentId());

		//查询当前购物车数据
		List<ShoppingCart> list = shoppingCartMapper.list(shoppingCart);

		//判断当前购物车数据是否存在
		if(list != null && list.size() > 0){
			//如果存在，就获取到当前购物车数据
			shoppingCart = list.get(0);

			//判断当前购物车数据中的数量是否为1，如果为1，则直接删除当前记录
			Integer number = shoppingCart.getNumber();
			if(number == 1){
				//当前商品在购物车中的份数为1，直接删除当前记录
				shoppingCartMapper.deleteById(shoppingCart.getId());
			}else {
				//当前商品在购物车中的份数不为1，修改份数即可
				shoppingCart.setNumber(shoppingCart.getNumber() - 1);
				shoppingCartMapper.updateNumberById(shoppingCart);
			}
		}
	}

}